﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using SIIE_ERP.Codigo.Login;
using SIIE_ERP.Codigo;
using SIIE_ERP.BaseDatos;
using SIIE_ERP.BaseDatos.Configuracion;
using System.Data;
using System.Data.OleDb;
using System.Xml;
using SIIE_ERP.BaseDatos.Login;
using System.Net.Mail;
using System.Net;
using System.Reflection;
using System.Diagnostics;
using Elysium.Demo.Registro;

namespace Elysium.Demo.Login
{
    /// <summary>
    /// Interaction logic for Login.xaml
    /// </summary>
    public partial class Login : Elysium.Controls.Window
    {
        XmlDocument configurationFile = new XmlDocument();

        public Login()
        {
            InitializeComponent();
            cargaDatos();

        }

        private void cargaDatos()
        {
            try
            {
                DataTable RFCs = Login_StoredProcedures.EmpresaLogin();
                ComboRFC.DataContext = RFCs;
                UsuarioLogin.Text = "";
                ContrasenaLogin.Password = "";

                ComboRFC.IsEnabled = true;
                UsuarioLogin.IsEnabled = true;
                ContrasenaLogin.IsEnabled = true;
        

                XmlDocument config = new XmlDocument();

                //  config.Load("config.xml");
                config.Load(@"C:\SIIE_Root\config.xml");
                XmlNode node = config.DocumentElement.SelectSingleNode("RFC");
                if (RFCs.Rows[0][0].ToString() == "DEMOSIEPYMES1")
                {
                    AmbienteDemoCheckBox.IsChecked = true;
                    UsuarioLogin.Text = "admin";
                    ContrasenaLogin.Password = "1234demo";

                    ComboRFC.IsEnabled = false;
                    UsuarioLogin.IsEnabled = false;
                    ContrasenaLogin.IsEnabled = false;
                }

                int MiIndex = 0;
                for (int i = 0; i < RFCs.Rows.Count; i++)
                {
                    if (RFCs.Rows[i][0].ToString().Equals(node.InnerText))
                    {
                        MiIndex = i;
                    }
                }

                ComboRFC.DataContext = RFCs;
                //RFCs_ComboBox.DisplayMemberPath = RFCs.Columns[0].ToString();

                ComboRFC.SelectedIndex = MiIndex;

            }
            catch (Exception x)
            {
                XmlDocument configurationFile = new XmlDocument();
                // configurationFile.Load("config.xml");
                configurationFile.Load(@"C:\SIIE_Root\config.xml");
                XmlNode node = configurationFile.DocumentElement.SelectSingleNode("path");

                if (node.InnerText.Substring(node.InnerText.Length - 26, 26) == "Informacion_SIEPyMEs.accdb")
                {
                    //   String path = node.InnerText;

                    String Path = node.InnerText.Replace("Informacion_SIEPyMEs.accdb", "Informacion_SIEPyMEsDemo.accdb");
                    //  SrvDB.SetDatabasePath(Path, "config.xml");
                    SrvDB.SetDatabasePath(Path, @"C:\SIIE_Root\config.xml");
                    SrvDB.CloseConnection();
                    AmbienteDemoCheckBox.IsChecked = true;
                }
                else
                {
                    String path = node.InnerText.Replace("Informacion_SIEPyMEsDemo.accdb", "Informacion_SIEPyMEs.accdb");
                    // SrvDB.SetDatabasePath(path, "config.xml");
                    SrvDB.SetDatabasePath(path, @"C:\SIIE_Root\config.xml");
                    SrvDB.CloseConnection();
                    AmbienteDemoCheckBox.IsChecked = false;

                }

                // String path = node.InnerText.Replace("Informacion_SIEPyMEsDemo", "Informacion_SIEPyMEs");

                cargaDatos();


                MessageBox.Show("No cuenta con la versión solicitada contacte a su administador del sistema.");

            }



        }

        // Detectar el enter en el Passwordbox
        private void ContrasenaLogin_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key != Key.Return && e.Key != Key.Enter)
                return;
            e.Handled = true;
            // Una vez detectado el enter, procede con el inicio de sesion
            IniciarSesion_Click(sender, e);
        }

        private void IniciarSesion_Click(object sender, RoutedEventArgs e)
        {

            try
            {
                XmlDocument config = new XmlDocument();
           //     config.Load("config.xml");

                config.Load(@"C:\SIIE_Root\config.xml");
                XmlNode node = config.DocumentElement.SelectSingleNode("RFC");
                node.InnerText = ComboRFC.Text;
               // XmlWriter writer = XmlWriter.Create("config.xml");
                XmlWriter writer = XmlWriter.Create(@"C:\SIIE_Root\config.xml");

              
                config.Save(writer);
                writer.Close();


                string Usuario = UsuarioLogin.Text;
                string Contrasena = ContrasenaLogin.Password;
                string Rfc = ComboRFC.Text;

                // Realiza la consulta a la base de datos

                string respuestaEmpresa = LoginCode.ValidaUsuarioEmpresa(Usuario, Rfc);
                if (respuestaEmpresa != "OK")
                {
                    if (Usuario.Equals("admin"))
                    {
                        MessageBox.Show("Su licencia ha caducado o no coincide al RFC.");
                        dbo_Sec_Usuario u = new dbo_Sec_Usuario();

                        UsuarioActivo UsuarioA = new UsuarioActivo(Usuario);
                        UsuarioA.IdUsuario = u.Get_Id_Usuario(Usuario);

                        MainWindow_NoLicencia mainWindow = new MainWindow_NoLicencia(UsuarioA);
                        mainWindow.Show();
                        this.Hide();
                        return;
                    }
                    else
                    {
                        MessageBox.Show("El usuario no existe o no coincide al RFC.");
                        return;
                    }
                }

                //Valida que la licencia ligada sea la asignada de ese usuario, validando con nombre de usuario y rfc T.
                Respuesta respuesta = LoginCode.ValidaUsuario(Usuario, Contrasena, Rfc);

                if (respuesta.Id == 4)
                {
                    if (Usuario.Equals("admin"))
                    {
                        MessageBox.Show("Su licencia ha caducado.");
                        dbo_Sec_Usuario u = new dbo_Sec_Usuario();

                        UsuarioActivo UsuarioA = new UsuarioActivo(Usuario);
                        UsuarioA.IdUsuario = u.Get_Id_Usuario(Usuario);

                        MainWindow_NoLicencia mainWindow = new MainWindow_NoLicencia(UsuarioA);
                        mainWindow.Show();
                        this.Hide();
                        return;
                    }
                }

                if (respuesta.Id == 5)
                {
                    MessageBox.Show(respuesta.Mensaje);
                    respuesta.Id = 6;
                }

                if (respuesta.Id == 6) // Autenticacion OK
                {
                    // Obtenemos el ID del usuario autenticado
                    // Creamos la ventana principal y le mandamos una instancia del usuario autenticado

                    dbo_Sec_Usuario u = new dbo_Sec_Usuario();

                    //Valida fecha de sesion del usuario
                    var fechaSesion = dbo_Sec_Usuario.Get_Usuario_Por_Id(u.Get_Id_Usuario(Usuario)).Rows[0];
                    DateTime XD = Convert.ToDateTime(fechaSesion["Fecha_Alta"].ToString().Substring(0, fechaSesion["Fecha_Alta"].ToString().Length - 5));
                    if (DateTime.Now < Convert.ToDateTime(fechaSesion["Fecha_Alta"].ToString().Substring(0, fechaSesion["Fecha_Alta"].ToString().Length - 5)))
                    {
                        MessageBox.Show("Error al iniciar sesión contacte a su Administrador del Sistema.");
                        return;
                    }


                    UsuarioActivo UsuarioA = new UsuarioActivo(Usuario);
                    UsuarioA.IdUsuario = u.Get_Id_Usuario(Usuario);
                    UsuarioA.RFC = Rfc;
                    //Guarda el MacAdddres de la del equipo que se logea con este usuario, para que solo se tenga una sesion del mismo usuario abierta T.
                    UsuarioA.MacAddres = u.Get_MACAddress();
                    u.Update_Usuario_MACAddress(UsuarioA.IdUsuario, u.Get_MACAddress());


                    // Checar si hay una nueva versión disponible
                    try
                    {
                        var Id_Usuario = dbo_Sec_Usuario_RFC.Get_Sec_Usuario_RFC_By_UserName(Usuario).Rows[0]["Id_Usuario"];
                        string[] CadenaLicencia = CypherClass.DescifrarTexto(dbo_Sec_Usuario_RFC.Get_Sec_Usuario_RFC_By_Id_Rfc(Rfc, Convert.ToInt32( Id_Usuario)).Rows[0]["Genero"].ToString()).Split('|');

                        DateTime Fecha_Licencia = Convert.ToDateTime(CadenaLicencia[0].Substring(0,CadenaLicencia[0].Length-5));
            

                        usuarios_Desktop.Service usuariosAlta = new usuarios_Desktop.Service();
                        usuariosAlta.Actualiza(Usuario.ToString(),Rfc.ToString(),u.Get_MACAddress().ToString(),Fecha_Licencia.ToString(),CadenaLicencia[3].ToString());
          


                        SIIE_ERP.BaseDatos.Configuracion.Empresa.dbo_Cat_Empresa Cat_Empresa = new SIIE_ERP.BaseDatos.Configuracion.Empresa.dbo_Cat_Empresa(Rfc, Usuario);
                        if (Boolean.Parse(Cat_Empresa.Get_Empresas().Rows[0]["EsCheckUpdate"].ToString()))
                        {
                            Assembly assembly = Assembly.GetExecutingAssembly();
                            FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);

                            Version version = new Version(fileVersionInfo.ProductVersion);
                            Version versionActual = new Version(Elysium.Demo.Ventas.WebServicesClass.GetCurrentVersion());

                            if (versionActual > version)
                            {
                                WindowNuevaVersion MiNuevaVersion = new WindowNuevaVersion() { WindowStartupLocation = WindowStartupLocation.CenterScreen };
                                MiNuevaVersion.ShowDialog();
                            }
                        }
                    }
                    catch (Exception)
                    {

                    }

                    MainWindow mainWindow = new MainWindow(UsuarioA);
                    mainWindow.Show();
                    this.Hide();
                }
                else
                {
                    // En caso de error en la autenticacion, muestra el mensaje de error correspondiente
                    MessageBox.Show(respuesta.Mensaje);
                }

                ContrasenaLogin.Password = "";
            }
            catch (Exception ex)
            {

                MessageBox.Show("Error de instalación contacte a su Administrador del Sistema...");
                return;
            }
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            Application.Current.Shutdown(0); // Cerrar definitivamente la aplicacion
        }

        private void ComboRFC_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            Elysium.Demo.Registro.WindowRecuperarContrasena window = new Elysium.Demo.Registro.WindowRecuperarContrasena() { WindowStartupLocation = System.Windows.WindowStartupLocation.CenterScreen };
            window.ShowDialog();
        }

        private void AmbienteDemoCheckBox_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (AmbienteDemoCheckBox.IsChecked == true)
                {

                    XmlDocument configurationFile = new XmlDocument();
            //        configurationFile.Load("config.xml");
                    configurationFile.Load(@"C:\SIIE_Root\config.xml");
                    XmlNode node = configurationFile.DocumentElement.SelectSingleNode("path");
                    String path = node.InnerText.Replace("Informacion_SIEPyMEs", "Informacion_SIEPyMEsDemo");
                  //  SrvDB.SetDatabasePath(path, "config.xml");
                    SrvDB.SetDatabasePath(path, @"C:\SIIE_Root\config.xml");
                    SrvDB.CloseConnection();

                }

                if (AmbienteDemoCheckBox.IsChecked == false)
                {
                    XmlDocument configurationFile = new XmlDocument();
                //    configurationFile.Load("config.xml");
                    configurationFile.Load(@"C:\SIIE_Root\config.xml");
                    XmlNode node = configurationFile.DocumentElement.SelectSingleNode("path");
                    String path = node.InnerText.Replace("Informacion_SIEPyMEsDemo", "Informacion_SIEPyMEs");
                 //   SrvDB.SetDatabasePath(path, "config.xml");
                    SrvDB.SetDatabasePath(path, @"C:\SIIE_Root\config.xml");
                    SrvDB.CloseConnection();

                }
                cargaDatos();
            }
            catch (Exception)
            {


                OleDbConnection myConnection = new OleDbConnection(SrvDB.GetDefaultConnection());
                myConnection.Open();
            }
        }
    }
}
